package com.restauranteejb.servlets;

import Facade.RestFacadeLocal;
import com.restauranteejb.utiles.Constantes;
import com.restauranteejb.utiles.JsonData;
import com.restauranteejb.utiles.Metodos;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.*;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;
import restaurante.entidades.*;

@WebServlet(name = "ObtieneDataServlet", urlPatterns = {"/ObtieneDataServlet"})
public class ObtieneDataServlet extends HttpServlet {

    @EJB
    private RestFacadeLocal restFacadeBean;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        response.setContentType(MediaType.APPLICATION_JSON);
        int opcion_realizar = Integer.parseInt(request.getParameter(Constantes.OPCION_REALIZAR));
        String resultadoJson = "";
        switch (opcion_realizar) {
            case 1:
                resultadoJson = obtenerMesasSvl(request);
                break;
            case 2:
                resultadoJson = obtenerProductos(request);
                break;
            case 3:
                resultadoJson = obtenerClientes(request);
                break;
            case 4:
                resultadoJson = obtenerCliente(request);
                break;
            case 10:
                resultadoJson = obtenerProductosParaPedidoSvl(request);
                break;
            case 11:
                resultadoJson = obtenerPedidoParaClienteSvl(request);
                break;
            case 12:
                resultadoJson = obtenerTipoComprobantes();
                break;
            case 13:
                resultadoJson = obtenerTipoDescuento();
                break;
            case 14:
                resultadoJson = obtenerPedidoParaFacturarMesaSvl(request);
                break;            
            case 20:
                resultadoJson = registrarPedidoSvl(request);
                break;
            case 21:
                resultadoJson = validarLogin(request);
                break;
            case 22:
                resultadoJson = facturarPedidoSvl(request);
                break;
            case 23:
                resultadoJson = registrarClienteSvl(request);
                break;
        }
        try {
            out.println(resultadoJson);
        } finally {
            out.close();
        }
    }
    
    private String registrarClienteSvl(HttpServletRequest request) {
        String dniCliente = request.getParameter(Constantes.REQUEST_NRO_DNI);
        String nombreCliente = request.getParameter(Constantes.REQUEST_NOMBRES);
        String apellidoCliente = request.getParameter(Constantes.REQUEST_APELLIDOS);
        String correlativoCliente = restFacadeBean.obtenerCorrelativoCliente();
        Cliente cliente = new Cliente();
        cliente.setIdCliente(correlativoCliente);
        cliente.setDni(dniCliente);
        cliente.setNombres(nombreCliente);
        cliente.setApellidos(apellidoCliente);
        restFacadeBean.agregarCliente(cliente);
        return Metodos.generarContextoJsonDesdeObject(new JsonData("ok"));
    }
    private String obtenerTipoDescuento(){
        List<Descuento> descuentos = restFacadeBean.listarDescuentos();
        return Metodos.generarContextoJsonDesdeObject(new JsonData(Metodos.listadoTipoDescuentoParaSelect(descuentos)));
    }
    private String obtenerTipoComprobantes() {
        List<TipoComprobante> comprobantes = restFacadeBean.listarTipoComprobante();
        return Metodos.generarContextoJsonDesdeObject(new JsonData(Metodos.listadoTipoComprobanteParaSelect(comprobantes)));
    }
    private String obtenerPedidoParaFacturarMesaSvl(HttpServletRequest request) {
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA);
        String idCliente = request.getParameter(Constantes.REQUEST_ID_CLIENTE);
        StringBuffer stringHtml = new StringBuffer();
        Pedido pedido = new Pedido();
        pedido.setClienteidCliente(new Cliente(idCliente));
        pedido.setMesaIdmesa(new Mesa(new Integer(nroMesa)));
        List<DetallePedido> detallePedido = restFacadeBean.listarDetallePedidoDePedido(pedido);
        double total=0.0;
        for(DetallePedido detalle: detallePedido){
            if(Metodos.verificarSiSonIguales(detalle.getEstado(),Constantes.PEDIDO_DETALLE_ATENDIDO)){
                stringHtml.append(Metodos.listadoUnProductoParaPedido(detalle.getProducto(), "" + detalle.getCantidad(),detalle));
                total+=Double.parseDouble(""+detalle.getProducto().getPrecio())*detalle.getCantidad();
            }     
        }
        stringHtml.append("<li><a href='#'>TOTAL A CANCELAR  (Sin Descuento)   --- > "+total+"</a></li>");
        return Metodos.generarContextoJsonDesdeObject(new JsonData(stringHtml.toString()));
    }
    private String obtenerPedidoParaClienteSvl(HttpServletRequest request) {
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA);
        String idCliente = request.getParameter(Constantes.REQUEST_ID_CLIENTE);
        StringBuffer stringHtml = new StringBuffer();
        Pedido pedido = new Pedido();
        pedido.setClienteidCliente(new Cliente(idCliente));
        pedido.setMesaIdmesa(new Mesa(new Integer(nroMesa)));
        List<DetallePedido> detallePedido = restFacadeBean.listarDetallePedidoDePedido(pedido);
        for(DetallePedido detalle: detallePedido){
            stringHtml.append(Metodos.listadoUnProductoParaPedido(detalle.getProducto(), "" + detalle.getCantidad(),detalle));
        }
        stringHtml.append(obtenerProductosParaPedidoSvl(request));
        return Metodos.generarContextoJsonDesdeObject(new JsonData(stringHtml.toString()));
    }
    private String obtenerCliente(HttpServletRequest request) {
        String idCliente = request.getParameter(Constantes.REQUEST_ID_CLIENTE);
        Cliente cliente = restFacadeBean.getCliente(idCliente);
        String dataCliente = cliente.getNombres() + ", " + cliente.getApellidos();
        return Metodos.generarContextoJsonDesdeObject(new JsonData(dataCliente));
    }

    private String obtenerClientes(HttpServletRequest request) {
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA);
        StringBuffer stringHtml = new StringBuffer();
        for (Cliente cliente : restFacadeBean.listaClientes()) {
            stringHtml.append(Metodos.listadoClientesHtml(cliente, nroMesa));
        }
        return Metodos.generarContextoJsonDesdeObject(new JsonData(stringHtml.toString()));
    }
    
    private String facturarPedidoSvl(HttpServletRequest request) {
        Pedido pedidoParaConsulta = new Pedido();
        Pedido pedido = new Pedido();
        Comprobante comprobante = new Comprobante();
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA);
        String idCliente = request.getParameter(Constantes.REQUEST_ID_CLIENTE);
        idCliente = idCliente.substring(0, (idCliente.trim().length()-1));
        int idDescuento = Integer.parseInt(request.getParameter(Constantes.REQUEST_ID_DESCUENTO));
        int idTipoComprobante = Integer.parseInt(request.getParameter(Constantes.REQUEST_ID_TIPO_COMPROBANTE));
        pedidoParaConsulta.setClienteidCliente(new Cliente(idCliente));
        pedidoParaConsulta.setMesaIdmesa(new Mesa(new Integer(nroMesa)));
        pedido = restFacadeBean.obtenerPedidoActivo(pedidoParaConsulta);
        Descuento descuento = restFacadeBean.getDescuento(idDescuento);
        int correlativoComprobante = restFacadeBean.obtenerCorrelativoComprobante();
        
        double total,subTotal,IGV,totalDcto;
        subTotal= Metodos.obtenerTotalCuenta(pedido);
        totalDcto = Double.parseDouble(""+descuento.getPorcentaje()) * subTotal;
        total = subTotal-totalDcto;
        IGV = 0.18*total;
        total = total-IGV;
        
        comprobante.setIdcomprobante(correlativoComprobante);
        comprobante.setDescuentoIdDscto(descuento);
        comprobante.setTipoComprobanteidtipoComprobante(new TipoComprobante(idTipoComprobante));
        comprobante.setTotal(BigDecimal.valueOf(total));
        comprobante.setTotalDscto(BigDecimal.valueOf(totalDcto));
        comprobante.setIgv(BigDecimal.valueOf(IGV));
        comprobante.setSubtotal(BigDecimal.valueOf(subTotal));
        comprobante.setPedidoIdpedido(pedido);
        comprobante.setEmpleadoIdEmpleado(pedido.getEmpleadoIdEmpleado());
        comprobante.setEstado(Short.valueOf("1"));
        pedido.setEstado(Constantes.PEDIDO_POR_FACTURAR);        
        restFacadeBean.agregarComprobante(comprobante);
        restFacadeBean.modificarPedido(pedido);
        return Metodos.generarContextoJsonDesdeObject(new JsonData("ok"));
    }
    private String registrarPedidoSvl(HttpServletRequest request) {
        boolean isModificacion=Boolean.FALSE;
        Pedido pedidoParaConsulta = new Pedido();
        Pedido pedido = new Pedido();
        int correlativoPedido = restFacadeBean.getMaxCount()+1;
        String codProductos = request.getParameter(Constantes.REQUEST_COD_PROD);
        String cantProductos = request.getParameter(Constantes.REQUEST_CANT_PROD);
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA);
        String idCliente = request.getParameter(Constantes.REQUEST_ID_CLIENTE);
        idCliente = idCliente.substring(0, idCliente.indexOf(Constantes.CHARACTER_NUMERAL));
        
        pedidoParaConsulta.setClienteidCliente(new Cliente(idCliente));
        pedidoParaConsulta.setMesaIdmesa(new Mesa(new Integer(nroMesa)));
        pedidoParaConsulta = restFacadeBean.obtenerPedidoActivo(pedidoParaConsulta);
        
        Map mapDataProductos = Metodos.obtenerParametrosDesdeArreglos(codProductos, cantProductos);
        if(pedidoParaConsulta==null){
            Mesa mesa = restFacadeBean.getMesa(Integer.parseInt(nroMesa));
            Cliente cliente = restFacadeBean.getCliente(idCliente);
            pedido.setMesaIdmesa(mesa);
            pedido.setEmpleadoIdEmpleado(restFacadeBean.getEmpleado("emp_15"));
            pedido.setClienteidCliente(cliente);
            pedido.setEstado(Constantes.PEDIDO_ACTIVO);
            pedido.setIdpedido(new Integer(correlativoPedido));
            pedido.setFecha(new Date());
        }else{
            pedido = pedidoParaConsulta;
            isModificacion=Boolean.TRUE;
        }
        
        List<DetallePedido> listDetalleProductos = new ArrayList<DetallePedido>();
        Iterator it = mapDataProductos.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            Producto p = restFacadeBean.getProducto(Integer.parseInt(""+e.getKey()));
            int correlativoDetallePedido = restFacadeBean.getMaxCountDetallePedido()+1;
            DetallePedido detalle = new DetallePedido(correlativoDetallePedido,p.getIdproducto(),pedido.getIdpedido());
            detalle.setProducto(p);
            detalle.setCantidad(Short.parseShort(""+e.getValue()));
            detalle.setEstado(Constantes.PEDIDO_DETALLE_PENDIENTE);
            double subMonto = Double.parseDouble(""+e.getValue()) * Double.parseDouble(""+p.getPrecio());
            detalle.setSubmonto(BigDecimal.valueOf(subMonto));            
            listDetalleProductos.add(detalle);
        }
        Collection<DetallePedido> c = new ArrayList<DetallePedido>(listDetalleProductos);
        pedido.setDetallePedidoCollection(c);
        
        if(isModificacion){
            restFacadeBean.modificarPedido(pedido);
        }else{            
            restFacadeBean.agregarPedido(pedido);
        }
        return Metodos.generarContextoJsonDesdeObject(new JsonData("OK"));
    }

    private String obtenerProductos(HttpServletRequest request) {
        List<Producto> productos = restFacadeBean.listarProducto();
        String codProductos = request.getParameter(Constantes.REQUEST_COD_PROD);
        Map mapData = Metodos.obtenerParametrosDesdeArreglos(codProductos);
        return Metodos.generarContextoJsonDesdeObject(new JsonData(Metodos.listadoProductoParaSelect(productos, mapData)));
    }

    private String obtenerProductosParaPedidoSvl(HttpServletRequest request) {
        String codProductos = request.getParameter(Constantes.REQUEST_COD_PROD);
        String cantProductos = request.getParameter(Constantes.REQUEST_CANT_PROD);
        Map mapData = Metodos.obtenerParametrosDesdeArreglos(codProductos, cantProductos);
        List<Producto> productos = restFacadeBean.listarProducto();
        StringBuffer stringHtml = new StringBuffer();
        for (Producto producto : productos) {
            if (mapData.get("" + producto.getIdproducto()) != null) {
                stringHtml.append(Metodos.listadoUnProductoParaPedido(producto, "" + mapData.get("" + producto.getIdproducto()),null));
            }
        }
        return stringHtml.toString();
    }

    private String obtenerMesasSvl(HttpServletRequest request) {
        String nroMesa = request.getParameter(Constantes.REQUEST_NRO_MESA), nombreCliente;
        List<Mesa> listadoMesas = restFacadeBean.listarMesas();
        List<Pedido> listadoPedido = restFacadeBean.listarPedidos();
        Map<Integer, String> datCliente = new HashMap();
        boolean isConsultaPorMesa = false;
        if (!Metodos.verificarSiEsNuloVacio(nroMesa)) {
            isConsultaPorMesa = true;
        }
        for (Mesa mesa : listadoMesas) {
            if (!Metodos.validarSiMesaTienePedido(mesa,listadoPedido)) {
                nombreCliente = Constantes.MESA_DESOCUPADA;
                datCliente.put(mesa.getIdmesa(), "");
            } else {
                Pedido pedido = Metodos.obtenerPedidoDesdeMesa(mesa, listadoPedido);
                nombreCliente = pedido.getClienteidCliente().getNombres();
                datCliente.put(mesa.getIdmesa(), pedido.getClienteidCliente().getIdCliente());
            }
            mesa.setDescripcion("Mesa N° " + mesa.getNumero() + " - " + nombreCliente);
            if (isConsultaPorMesa && Metodos.verificarSiSonIguales(nroMesa, mesa.getNumero())) {
                listadoMesas = new ArrayList<Mesa>();
                listadoMesas.add(mesa);
                break;
            }
        }
        if (isConsultaPorMesa && listadoMesas.size() > 1) {
            listadoMesas = null;
        }
        return Metodos.generarContextoJsonDesdeObject(new JsonData(Metodos.listadoMesasHtml(listadoMesas, datCliente)));
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

    private String validarLogin(HttpServletRequest request) {
        String user = request.getParameter("user").trim();
        String pwd = request.getParameter("pwd").trim();
        for(Usuario users: restFacadeBean.listarUsuarios()){
            if(Metodos.verificarSiSonIguales(users.getUsuario(), user)){
                if(Metodos.verificarSiSonIguales(users.getPass(),pwd)){
                    return "ok";
                }
            }
        }
        return "";
    }

}